/*
 * Copyright (c) 2011 Anthony Vandikas
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 
 * files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
 * modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "stdafx.h"
#include "FileStudentList.h"

FileStudentList::FileStudentList(const QString &filename)
	: filename(filename)
{ 
	bool success;
	QList<Student> students;

	std::tie(success, students) = useFileData<QList<Student>>(
		filename,
		QFile::ReadOnly,
		[&](QDataStream *stream) -> QList<Student>
		{
			QList<Student> output;
			*stream >> output;
			
			return output;
		});

	if (success)
		reset(students);
}

FileStudentList::~FileStudentList()
{
	QFile::remove(filename);

	useFileData<bool>(
		filename,
		QFile::WriteOnly,
		[&](QDataStream *stream) -> bool
		{
			*stream << students.values();
			return true;
		});
}

void FileStudentList::reset(const QList<Student> &values)
{
	students.clear();
	foreach (auto value, values)
		students[value.getIdentifier()] = value;

	emit modified();
}

void FileStudentList::setPassword(const QString &identifier, const QString &password) 
{
	students[identifier].setPassword(password); 
}

bool FileStudentList::contains(const QString &identifier) const { return students.contains(identifier); }
int FileStudentList::getSize() const { return students.size(); }

Student FileStudentList::operator [](const QString &identifier) const { return students[identifier]; }
Student FileStudentList::operator [](int index) const { return students[students.keys()[index]]; }
